上次介紹了OO的三個特性:封裝、繼承跟多型,大家還記得嗎?有辦法用自己的話來說明與舉例子嗎?
如果還沒,建議您先去看前面那一篇:http://ithelp.ithome.com.tw/question/10053333
這一篇文章,要介紹更抽象的abstract與interface。
希望透過這篇文章,讓原本攪在一起的觀念可以釐清一下。
前言
抽象這個term本身就很抽象,我的自己用一段話來定義『抽象』:
抽象就是不管實作內容。抽象就是用實際世界的角度思考,而非寫code的角度思考
接下來,我們來說明Abstract與Interface:
1.Abstract
(1)不能被直接實體化使用,所以我們可以把實體化沒有任何意義的class宣告成abstract
(2)宣告成abstract的property與function都會強制子類別需overrides
(3)用來定義抽象的屬性、行為
(4)也是一種Super Class,可以在abstract class裡面,定義需被繼承且覆寫,以及可被繼承的實體屬性與方法,也就是方法內具備內容。
2.Interface
(1)類似contract的概念,實作介面就該履行內容
(2)抽象化的屬性與行為
(3)不需要擁有相同的父類別,也可以具備同樣的行為
(4)介面的定義應該簡潔明瞭 (SOLID原則中的L原則)
3.Abstract與Interface在系統中扮演的角色
(1)Abstract:決定了系統的Reuse程度。透過繼承與限制,可決定子類別的設計方式。
(2)Interface:決定了系統設計的抽象程度。透過實作介面,來定義物件之間的抽象行為與關係。
4.Abstract與Interface的差異
其實Interface可以當作abstract極致化的概念產物,
但是abstract class裡面,是可以包含實作的,這是最大的差異。
光這樣說,有一點難以理解。我們舉個例子來說明 (雖然單純用文字說明也不是挺好懂的)
PS:這個例子是Design Pattern裡面,Template Method pattern的實作case。
例如:
1.我們有一個interface,叫做『生活起居』,裡面有個方法是『起床』。
2.我們有一個abstract class,叫做『每個家庭的爸爸』,實作『生活起居』這個interface。
我們這個爸爸的abstract class裡面,定義了三個abstract protected(或public)的void,分別是『刷牙』、『洗臉』跟『大便』。因為定義成abstract,所以這三個方法實際的內容,得由子類別覆寫後來決定。
3.我們希望繼承『每個家庭的爸爸』的子類別,他們的『起床』行為,裡面就是要依序執行『每個家庭的爸爸』abstract class裡面的『刷牙』、『洗臉』跟『大便』這三個void。由這三個方法組成『每個家庭的爸爸』的『起床行為』。
4.倘若我們要限制子類別不可以修改此『起床』行為,那麼我們就寫成這樣
interface
public interface ICommonLife
{
/// <summary>
/// 起床
/// </summary>
void GetUp();
}
abstract class
public abstract class AbstractDaddy : ICommonLife
{
public abstract void 刷牙();
public abstract void 洗臉();
public abstract void 大便();
#region ICommonLife 成員
/// <summary>
/// 起床
/// </summary>
/// <remarks>
/// 當繼承AbstractDaddy的時候,強迫繼承的子類別其GetUp行為,一定得是先刷牙、洗臉,再大便,才算完成起床的動作。
/// 而實際的刷牙、洗臉跟大便的內容跟方式,則由子類別自行決定。
/// 這樣的限制(或稱為reuse,因為子類別不需在重複定義這樣的起床行為),只有abstract可以做,interface做不了
/// </remarks>
public void GetUp()
{
this.刷牙();
this.洗臉();
this.大便();
}
#endregion
}
結論:如同註解內所提到,因為interface無法加入實作內容 (也因此interface才可以定義抽象行為),所以要達到這個case裡面限制『起床』行為的需求,只能透過abstract來作。
================================
最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:
1.什麼是abstract? 請舉例。
2.什麼是interface? 請舉例。
3.abstract與interface的差異? 請舉出只能用abstract,不可以用interface的例子。
4.abstract與interface在系統中扮演的角色為何?
整篇文章就是寫得很抽象.
跟外面的文章教課書沒有不同.
Interface是以功能面去看.他跟物件導向沒什麼關連.
我只要實作這個介面,就表示我有這種能力.不用去管他有沒有繼承的關係.
Abstract就是部分實作.我把大部分的功能或骨幹做出來,企業邏輯的細節就由使用者去定義跟實作.
abstract 和企業邏輯有什麼關係 ? WebRequest就是個 abstract 類別, 請告訴我要怎麼鬼扯之後可以和企業邏輯搞上不倫之戀 ?
說真的, 我實在很不想說你只是隻紙老虎, 因為你老是講一些不知所云的東西 (包含在其他論壇) 還以為自己在述說一件真理 ! 結果都是一堆鬼話, 只是沒人敢像我這樣搓破你而已.
比如說有你要寫一支(一堆)壓縮程式.
這支壓縮程式的骨幹80%相同,只有20%也就壓縮跟解壓縮不同(這個地方就是你的企業邏輯).
你只要繼承這個抽象類別然後將你20%的企業邏輯填入後就可以使用這個邏輯了.
企業邏輯是一個統稱:他看的是你的專業領域.你不要看到企業邏輯就認為像ERP那種企業.
你去把它(WebRequest)看清楚.看他的實作類別怎麼實作.他裡面一定有幾個未完成的方法.這個方法就是你要補你企業邏輯的地方.
討論區,本來就是在討論的.
我也沒說你錯.
我也不是專門就是要堵你?
我是看文章回,也有回別人!不是我知識領域的我不回.
我是不是紙老虎,我是不知道?
你去其他論壇看我文章.謝謝你.
是不是鬼話?不清楚.我只知道堵我的少,頂我的多(看推的人數就知道了).
麻煩一下弄個幾篇技術文章來讓大家品頭論足一下, 讓我看看你有多行.
//弄個幾篇技術文章來讓大家品頭論足一下.
這個不需要吧!
這種文章,在書店的教科書或網上非常多.
光是MS一天就出非常多的技術文章,轉貼沒什麼意義?
這種文章跟老師教的都沒錯.但感覺有缺什麼感覺.
就跟外面賣的教課書一樣.每一本寫的都一樣,但你去翻一翻,只有幾本你覺得是好的.
我不是寫書的.我也寫不出書來.我也不會到處找文章貼.
像Interface有非常多的功能.像這篇文章Interface寫的沒錯,但少了生命力.沒人想學,沒人想用.
Interface的一個功用是元件可抽換跟系統架構降偶的能力.
而Interface在Design Pattern也用的非常多.
"Interface的一個功用是元件可抽換跟系統架構降偶(耦)的能力."
個人認為上面這句話才是重點
http://www.dofactory.com/Patterns/PatternAbstract.aspx
Abstract的一種用法.